package cn.itcast.service.impl;

import cn.itcast.dao.cargo.*;
import cn.itcast.domain.cargo.*;
import cn.itcast.domain.vo.ExportProductResult;
import cn.itcast.domain.vo.ExportResult;
import cn.itcast.service.ExportService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

@Service
public class ExportServiceImpl implements ExportService {
    @Autowired
    private ExportDao exportDao;//报运单
    @Autowired
    private ExportProductDao exportProductDao;//报运单下的货物
    @Autowired
    private  ExtEproductDao extEproductDao;//包运单下的附件
    @Autowired
    private ContractDao contractDao;//合同
    @Autowired
    private ContractProductDao contractProductDao;//货物
    @Autowired
    private ExtCproductDao extCproductDao;//附件

    @Override
    public Export findById(String id) {
        Export export = exportDao.selectByPrimaryKey(id);
        return export;
    }
    /*新增报运单*/
    @Override
    public void save(Export export) {
        //1 合同状态变
        //1.1 切割合同id
        String contractIds = export.getContractIds();
        String[] arrIds = contractIds.split(",");
        //1.2 根据合同id拿到对应的合同
        StringBuffer stringBuffer=new StringBuffer();
        for (int i = 0; i <arrIds.length;i++) {
            Contract contract = contractDao.selectByPrimaryKey(arrIds[i]);
            //1.3 修改合同状态到数据库 （state=2）
            contract.setState(2);
            contractDao.updateByPrimaryKeySelective(contract);
            //1.4 记录合同的合同号 （"ht0001 ht0002"）
            stringBuffer.append(contract.getContractNo()).append(" ");
        }
        //2 报运单变  1条报运单数据
        // 2.1 设置报运单的额外属性（主键 合同号 创建时间 报运单状态）
        export.setId(UUID.randomUUID().toString());
        export.setContractIds(stringBuffer.toString());
        export.setCreateTime(new Date());
        export.setState(0);//新增一个报运单都是草稿状态
        /*货物的数量   附件的数量*/

        //3 报运单的货物变 4条货物数据
        //3.1 通过合同的id拿到合同的所有货物
        ContractProductExample contractProductExample = new ContractProductExample();
        ContractProductExample.Criteria criteria = contractProductExample.createCriteria();
        /*把数组转化为list集合*/
        List<String> list = Arrays.asList(arrIds);
        criteria.andContractIdIn(list);
        List<ContractProduct> contractProducts = contractProductDao.selectByExample(contractProductExample);
        Map<String,String> map=new HashMap<>();
        //3.2 有一个合同的货物就得有一个报运单的货物
        for (ContractProduct contractProduct : contractProducts) {
            ExportProduct exportProduct = new ExportProduct();
            //3.3 将合同的货物对象数据给报运单的货物对象
            /*属性之间的赋值*/
            BeanUtils.copyProperties(contractProduct,exportProduct);
            //3.4 单独将报运单货物的主键设置唯一
            exportProduct.setId(UUID.randomUUID().toString());
            //3.5 单独设置当前循环的报运单货物对象属于指定的报运单
            exportProduct.setExportId(export.getId());
            //3.6 保存报运单的货物对象到报运单的货物表中
            exportProductDao.insertSelective(exportProduct);
            //3.7 将合同的货物id作为key 将报运单的货物id做为值  map<合同货物id,报运单货物id>
            //用于指定那个附件属于那个货物
                 map.put(contractProduct.getId(),exportProduct.getExportId());
        }
        //4 报运单的附件变 3条附件数据
        //4.1 通过合同的id获取到合同的附件
        ExtCproductExample extCproductExample=new ExtCproductExample();
        ExtCproductExample.Criteria criteria1 = extCproductExample.createCriteria();
        criteria1.andContractIdIn(list);
        List<ExtCproduct> extCproducts = extCproductDao.selectByExample(extCproductExample);
        //4.2 有一个合同的附件就得有一个报运单的附件  extCproduct.getContractProduct==合同的货物id
        for (ExtCproduct extCproduct : extCproducts) {
            ExtEproduct extEproduct = new ExtEproduct();
            //4.3 将合同的附件对象数据给报运单的附件对象
            BeanUtils.copyProperties(extCproduct,extEproduct);
            //4.4 单独将报运单附件的主键设置唯一
            extEproduct.setId(UUID.randomUUID().toString());
            //4.5 单独设置当前循环的报运单附件对象属于指定的报运单货物
            extEproduct.setExportProductId(map.get(extCproduct.getContractProductId()));
            //设置包运单id
            extEproduct.setExportId(export.getId());
            //4.7 保存报运单的附件对象到报运单的附件表中
            extEproductDao.insertSelective(extEproduct);
        }
        //2.2 设置报运单的货物数
        export.setProNum(contractProducts.size());
        //2.3 设置报运单的附件数
        export.setExtNum(extCproducts.size());
        /*报运单保存到数据库*/
        exportDao.insertSelective(export);
    }

    @Override
    public void update(Export export) {
        exportDao.updateByPrimaryKeySelective(export);
        /*修改报运单下的货物*/
        List<ExportProduct> exportProducts = export.getExportProducts();
        if (exportProducts!=null){
            for (ExportProduct exportProduct : exportProducts) {
                exportProductDao.updateByPrimaryKeySelective(exportProduct);
            }
        }

    }

    @Override
    public void delete(String id) {

        /*根据id获取报运单下的货物*/
        ExtEproductExample extEproductExample=new ExtEproductExample();
        ExtEproductExample.Criteria criteria = extEproductExample.createCriteria();
        criteria.andExportIdEqualTo(id);
        List<ExtEproduct> extEproducts = extEproductDao.selectByExample(extEproductExample);
        for (ExtEproduct extEproduct : extEproducts) {
            extEproductDao.deleteByPrimaryKey(extEproduct.getId());
        }
        /*货物*/
        ExportProductExample exportProductExample = new ExportProductExample();
        ExportProductExample.Criteria criteria1 = exportProductExample.createCriteria();
        criteria1.andExportIdEqualTo(id);
        List<ExportProduct> exportProducts = exportProductDao.selectByExample(exportProductExample);
        for (ExportProduct exportProduct : exportProducts) {
            exportProductDao.deleteByPrimaryKey(exportProduct.getId());
        }
        exportDao.deleteByPrimaryKey(id);
    }

    @Override
    public PageInfo findAll(ExportExample example, int page, int size) {
        PageHelper.startPage(page,size);
        List<Export> exports = exportDao.selectByExample(example);
        PageInfo pageInfo=new PageInfo(exports);
        return pageInfo;
    }
    /*海关 给的数据*/
    @Override
    public void updateExportAndExportProduct(ExportResult exportResult) {
        String exportId = exportResult.getExportId();
        /*修改报运单数据*/
        Export export = exportDao.selectByPrimaryKey(exportId);
        export.setState(exportResult.getState());
        export.setRemark(exportResult.getRemark());
        exportDao.updateByPrimaryKeySelective(export);
        Set<ExportProductResult> products = exportResult.getProducts();
        if (products!=null){
            for (ExportProductResult product : products) {
                ExportProduct exportProduct = exportProductDao.selectByPrimaryKey(product.getExportProductId());
                exportProduct.setTax(product.getTax());
                exportProductDao.updateByPrimaryKeySelective(exportProduct);
            }
        }

        /*修改合同的状态*/
        /*获取合同号*/
        String contractIds = export.getContractIds();
        String[] split = contractIds.split(" ");
        System.out.println(Arrays.toString(split));
        if (split!=null){
        for (String s : split) {
            Contract contract = contractDao.selectByPrimaryKey(s);
            if (contract!=null){
                System.out.println(s);
                System.out.println(contract);
                //修改合同状态为已经报运完
                contract.setState(2);
                contractDao.updateByPrimaryKeySelective(contract);
            }
            }

        }

    }
}
